package cn.me.alphamq.common.util;

import cn.me.alphamq.common.config.GlobalProperties;
import cn.me.alphamq.common.constant.GlobalConstant;

/**
 * 给 CommitLog 和 ConsumeQueue 文件命名的工具类
 *
 * @author f
 */
public class FileNameUtil {

    /**
     * 生成第一份 CommitLog/ConsumeQueue 文件名称
     *
     * @return
     */
    public static String generateFileName() {
        return "00000000";
    }

    /**
     * 生成起始消费偏移量的名称 "00000000#0"
     *
     * @return
     */
    public static String generateConsumerOffset() {
        return generateFileName() + "#0";
    }

    /**
     * 根据旧的 CommitLog 或 ConsumeQueue 文件名，获取新的 CommitLog 或 ConsumeQueue 文件名
     *
     * @param oldFileName
     * @return
     */
    public static String getNewFileName(String oldFileName) {
        if (!oldFileName.matches("\\d{8}")) {
            throw new IllegalArgumentException("file name format error");
        }
        long fileIndex = Long.parseLong(oldFileName) + 1;
        String newFileName = String.format("%08d", fileIndex);
        if (newFileName.length() != 8) {
            throw new RuntimeException("file name exceeds 8 digits");
        }
        return newFileName;
    }

    /**
     * 根据 topic 获取 CommitLog 文件的目录路径
     *
     * @param topicName topic 名称
     * @return
     */
    public static String getCommitLogFileDir(String topicName) {
        return GlobalProperties.getAlphaMqHome()
               + GlobalConstant.COMMIT_LOG_DIR
               + topicName + "/";
    }

    /**
     * 根据 topic 获取 ConsumeQueue 文件的父目录路径
     *
     * @param topicName topic 名称
     * @return
     */
    public static String getConsumeQueueFileBaseDir(String topicName) {
        return GlobalProperties.getAlphaMqHome()
               + GlobalConstant.CONSUME_QUEUE_DIR
               + topicName + "/";
    }

    /**
     * 根据 topic 和 队列 id 获取 ConsumeQueue 文件的目录路径
     *
     * @param topicName topic 名称
     * @param queueId   队列的 id
     * @return
     */
    public static String getConsumeQueueFileDir(String topicName, int queueId) {
        return getConsumeQueueFileBaseDir(topicName)
               + queueId + "/";
    }
}
